#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int N=1005;
const int M=10050;
const int INF=0x3f3f3f3f;
int s,t;
int cnt;
int head[N];
int dep[N];
int T;
int n,m;
int a[N],b[N];
int x;
int sum;
struct Edge{
    int u,v,w;
    int next;
}e[M];
void init(){
    memset(head,-1,sizeof(head));
    memset(dep,0,sizeof(dep));
    memset(e,0,sizeof(e));
    cnt=0;
    sum=0;
}
void addEdge(int u,int v,int w){
    e[cnt].u=u;
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].next=head[u];
    head[u]=cnt++;
    e[cnt].u=v;
    e[cnt].v=u;
    e[cnt].w=0;
    e[cnt].next=head[v];
    head[v]=cnt++;
}
bool bfs(){
    queue<int> q;
    memset(dep,0,sizeof(dep));
    dep[s]=1;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=head[u];i!=-1;i=e[i].next){
            int v=e[i].v;
            int w=e[i].w;
            if(w>0 && dep[v]==0){
                dep[v]=dep[u]+1;
                q.push(v);
            }
        }
    }
    if(dep[t]==0){
        return false;
    }
    return true;
}
int dfs(int u,int flow){
    if(u==t){
        return flow;
    }
    for(int i=head[u];i!=-1;i=e[i].next){
        int v=e[i].v;
        int w=e[i].w;
        if(dep[v]==dep[u]+1 && w!=0){
            int dis=dfs(v,min(w,flow));
            if(dis>0){
                e[i].w-=dis;
                e[i^1].w+=dis;
                return dis;
            }
        }
    }
    return 0;
}
int dinic(){
    int ans=0;
    while(bfs()){
        while(int d=dfs(s,INF)){
            ans+=d;
            //printf("%d\n",ans);
        }
    }
    return ans;
}
int main(void){
    scanf("%d",&T);
    while(T--){
        init();
        scanf("%d%d",&n,&m);
        s=n+m+1;
        t=n+m+2;
        for(int i=1;i<=m;i++){
            scanf("%d",&x);
            addEdge(n+i,t,x);
            //最后预计总流量
            sum+=x;
        }
        for(int i=1;i<=n;i++){
            scanf("%d%d",&a[i],&b[i]);
            addEdge(s,i,a[i]);
            for(int j=0;j<b[i];j++){
                scanf("%d",&x);
                addEdge(i,n+x,1);
            }
        }
        int ans=dinic();
        //printf("%d %d %d %d\n",s,t,ans,sum);
        if(ans==sum){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    return 0;
}